//
// Created by 王一飞 on 2021/1/3.
//

#include <dirent.h>
#include <stdio.h>
#include "func.h"
#include <sys/stat.h>
#include <time.h>
#include <string.h>

extern int a_flag;
extern int l_flag;
extern int flag_of_mulDir;
struct dirent **fileList;


void ls_all_file(char *dirName) {
    int cnt;
    cnt = scandir(dirName, &fileList, NULL, alphasort);
    if (cnt == -1) {
        // perror("scandir");
        printf("ls : %s: No such file or directory\n", dirName);
    } else {                        
        for (int i = 0; i < cnt; i++) {
            // -a 对应
            if (fileList[i]->d_name[0] == '.' && !a_flag) {
                continue;
            }            
            // -l的换行对应
            char allDir[2048];
            if (l_flag) {
                i && printf("\n");
                getAllDir(dirName, fileList[i], allDir);
                // getFileInfo(allDir, &fileInfo);
            }
            struct stat fileInfo;
            if (l_flag) {
                getFileInfo(allDir, &fileInfo);
            }
            printf("%s\t", fileList[i]->d_name);
            // if (l_flag) 
            //     printf("\n");
            free(fileList[i]);
        }
        printf("\n");
        free(fileList);
    }


    // DIR *directory_pointer;
    // // struct dirent *entry;
    // if ((directory_pointer = opendir(dirName)) == NULL) {
    //     // printf("Error opening\n");
    //     printf("ls : %s: No such file or directory\n", dirName);
    // } else {
    //     ls_a(directory_pointer, dirName);

    //     closedir(directory_pointer);
    // }
    // // printf("-------------------------------------\n");
    // printf("\n");
}

int getFileInfo(char *fileName, struct stat *fileInfo) {
    if (stat(fileName, fileInfo) < 0) {
        printf("Error_getFileInfo");
        return -1;
    }
    unsigned int mask = 0000777;
    unsigned int access = mask & fileInfo->st_mode;
    // printf("%o\t%d\t", access, fileInfo->st_uid);
    // printf("%ld\n", fileInfo->st_atimespec);
    char accessStr[15];
    memset(accessStr, 0, sizeof(char) * 15);
    accessChange(fileInfo, accessStr);
    printf("%s\t", accessStr);
    struct tm t;
    char date_time[64];
    strftime(date_time, sizeof(date_time), "%Y-%m-%d %H:%M:%S", localtime_r(&fileInfo->st_ctim.tv_sec, &t));
    printf("%s\t", date_time);

    return 0;
}

// void ls_a(DIR *directory_pointer, char *dirName) {
//     struct stat fileInfo;
//     struct dirent *entry;
//     char allDir[2048];
//     if (flag_of_mulDir) {
//         printf("%s:\n", dirName);
//     }
//     int flag = 0;
//     while ((entry = readdir(directory_pointer)) != NULL) {
//         if (entry->d_name[0] == '.' && !a_flag) {
//             continue;
//         }
//         // l的换行对应
//         if (l_flag) {
//             flag && printf("\n");
//             // char allDir[2048];
//             getAllDir(dirName, entry, allDir);
//             // getFileInfo(allDir, &fileInfo);
//         }
//         flag++;
//         switch (entry->d_type) {
//             case DT_DIR:
//                 if (l_flag) {
//                     printf("d");
//                     getFileInfo(allDir, &fileInfo);
//                 }
//                 printf(SKYBLUD("%s\t"), entry->d_name);
//                 break;
//             case DT_LNK:
//                 if (l_flag) {
//                     printf("l");
//                     getFileInfo(allDir, &fileInfo);
//                 }
//                 printf(PURPLE("%s\t"), entry->d_name);
//                 break;
//             default:
//                 printf("%s\t", entry->d_name);
//         }
//     }
// }

void ls_l(DIR *directory_pointer, char *dirName) {

}

int getAllDir(char *dirName, struct dirent *entry, char *allDir) {
    strcpy(allDir, dirName);
    if (dirName[strlen(dirName) - 1] != '/') {
        strcat(allDir, "/");
    }
    strcat(allDir, entry->d_name);
    return 0;
}

int accessChange(struct stat *fileInfo, char *accessStr) {
    (fileInfo->st_mode & S_IRUSR) ? strcat(accessStr, "r") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IWUSR) ? strcat(accessStr, "w") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IXUSR) ? strcat(accessStr, "x") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IRGRP) ? strcat(accessStr, "r") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IWGRP) ? strcat(accessStr, "w") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IXGRP) ? strcat(accessStr, "x") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IROTH) ? strcat(accessStr, "r") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IWOTH) ? strcat(accessStr, "w") : strcat(accessStr, "-");
    (fileInfo->st_mode & S_IXOTH) ? strcat(accessStr, "x") : strcat(accessStr, "-");

    return 0;
}
